package com.mjk.common.tools.excel;


import com.mjk.common.base.model.BaseEntity;
import com.mjk.common.tools.excel.annotation.ExportFiled;
import com.mjk.common.util.ObjectUtils;
import com.mjk.common.util.ReflectionUtils;
import com.mjk.common.util.StrUtils;
import org.springframework.core.annotation.AnnotatedElementUtils;

import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public interface IFileImportAndExport {
	/**
	 * 导入文件 根据文件获取对象列表
     */
    <T extends BaseEntity> List<T> importFile(Class<T> clazz, InputStream xls, String encode);
	/**
	 * 更具查询对象生成对应的导出文件
     */
    <T extends BaseEntity> void exportFile(List<T> list, String fileName);
	/**
	 * 导出数据，按照每一条数据写入
	 * @param t 写入的数据
	 * @param fileName 文件名称
	 * @param process 完成度 100 全部完成
	 */
    <T extends BaseEntity> void exportFile(T t, String fileName, int index, int process);
	/**
	 * 更具对应的class类获取 头
     */
	default <T extends BaseEntity> Map<String ,String> getExportFieldMap(Class<T> clazz){
		Field[] fields = clazz.getDeclaredFields();
		Map<String ,String> result = new HashMap<>();
		for(Field f : fields){
			ExportFiled filed = AnnotatedElementUtils.getMergedAnnotation(f, ExportFiled.class);
			if(null!=filed && ObjectUtils.isNotEmpty(filed.comment())) {
				result.put(filed.comment(), f.getName());
			}else {
				result.put(f.getName(), f.getName());
			}
		}
		return result;
	}

	/**
	 * 获取文件头
	 */
	default  <T> String[] getTitle(T t){
		Field[] fields = t.getClass().getDeclaredFields();
		List<String> titles = new ArrayList<>();
		for(Field f : fields){
			ExportFiled filed = AnnotatedElementUtils.getMergedAnnotation(f, ExportFiled.class);
			if(null!=filed && ObjectUtils.isNotEmpty(filed.comment())) {
				titles.add(filed.comment());
			}else {
				//titles.add(f.getName());
			}
		}
		return titles.toArray(new String[0]);
	}

	default  <T> List<String> getItemValue(T t){
		Field[] fields = t.getClass().getDeclaredFields();
		List<String> values = new ArrayList<>();
		for(Field f : fields){
			ExportFiled filed = AnnotatedElementUtils.getMergedAnnotation(f, ExportFiled.class);
			if(null!=filed && ObjectUtils.isNotEmpty(filed.comment())){
				Object o = ReflectionUtils.getFieldValue(t, f.getName());
				if (ObjectUtils.isNotEmpty(o) && StrUtils.isNumeric(o.toString()) && o.toString().length() > 10) {
					values.add((null == o) ? "" : o.toString() + "\t");
				} else {
					values.add((null == o) ? "" : o.toString());
				}
			}
		}
		return values;
	}
}
